package CGLIB;

import org.junit.Test;
import sun.misc.ProxyGenerator;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author KiraYous
 * @version V1.0
 * @Package CGLIB
 * @date 2021/9/16 16:31
 * 测试类
 * 结论：最后都会根据你的增强器（增强器立马invoke实现切面），被代理对象，
 * 和proxy（这个是库里面的）类调用底层的一个native 方法->defineClass方法生成一个继承自被代理类的类，
 * 并加载进jvm形成名为$proxy+编号的Class对象
 * 之后再根据这个新的Class对象生成实例返回
 *
 * 至于如何做到凭空从内存里面生成Class，那就得需要很高超的汇编语言知识，以及操作系统之类的知识了
 * 这些都是很底层的工作了
 */
public class MyTest {

    @Test
    public void test() throws IOException {

        CGLIBProxyFactory proxyFactory=new CGLIBProxyFactory();
        Target tt=new Target();
        Target proxy=(Target) proxyFactory.createProxy(tt);//强转换
        proxy.operationSomethingImportant();
        FileOutputStream fis=null;

        byte[] bytes= ProxyGenerator.generateProxyClass("$MyProxy",new Class[]{proxy.getClass()});
        try {
            fis =new FileOutputStream(System.getProperty("user.dir")+"\\target\\test\\MyProxy.class");
            fis.write(bytes);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fis!=null){
                fis.close();
            }

        }

    }

    @Test
    public void test1(){

        System.out.println();

    }
}
